/**
 * 
 * Author：liaozhanggen
 * Create Date：2017年3月30日
 * Version：v2.0
 */
package com.choosefine.base.shixiaobao.common.utils;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.mongodb.core.query.BasicQuery;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.util.StringUtils;

import com.choosefine.base.shixiaobao.common.def.CommonConstant;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;

/**
 * 实现根据实体转Mongodb对应的参数类型
 * 
 * Author：liaozhanggen
 * Create Date：2017年3月30日
 * Version：v2.0
 */
public class MongoUtils {
	
	private static Logger logger = LoggerFactory.getLogger(MongoUtils.class);

	
    /**
     * Bean --> Update 1: 利用Introspector和PropertyDescriptor 将Bean --> Update  
     *
     * @Author：liaozhanggen
     * @Create Date：2017年3月30日
     * @param：....
     * @return：Update
     */
    public static Update transBean2Update(Object obj) {  
  
        if(obj == null){  
            return null;  
        }
        Update update = new Update();
        try {  
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());  
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();  
            for (PropertyDescriptor property : propertyDescriptors) {  
                String key = property.getName();
                
                // 过滤class属性  
                if (!key.equals("class") && !CommonConstant.USER_CODE.equalsIgnoreCase(key)) {  
                    // 得到property对应的getter方法  
                    Method getter = property.getReadMethod();  
                    Object value = getter.invoke(obj);
                    if (!StringUtils.isEmpty(value)) { //为空时不做处理
                    	update.set(key, value);  
					}
                }  
            }  
        } catch (Exception e) {
        	logger.error("transBean2Map Error " + e);  
        }  
        return update;  
    }

    /**
     * 根据条件,查询指定的结果字段
     * 
     * @Author：liaozhanggen
     * @Create Date：2017年5月12日
     * @param fields
     * @return
     */
    public static Query queryMongo(Map<String,Object> queryObject,String[] fields){
    	DBObject dbObject = new BasicDBObject();
    	if (null != queryObject) {
			for (String key : queryObject.keySet()) {
				dbObject.put(key, queryObject.get(key));
			} 
		}
		DBObject fieldObject = new BasicDBObject();
	    if (null != fields) {
			for (String field : fields) {
				fieldObject.put(field, true);
			} 
		}
		Query query = new BasicQuery(dbObject, fieldObject); //查询指定的结果字段
		return query;
    }
    
    /**
     * 任何类型参数，返回query对象
     * 
     * @Description：
     * @Author：chenjian
     * @Create Date：2017年6月10日
     * @param：
     * @return：
     */
    public static Query queryMongo(Criteria queryObject,String[] fields){
    	DBObject dbObject = new BasicDBObject();
    	dbObject.putAll(queryObject.getCriteriaObject());
		DBObject fieldObject = new BasicDBObject();
	    if (null != fields) {
			for (String field : fields) {
				fieldObject.put(field, true);
			} 
		}
		Query query = new BasicQuery(dbObject, fieldObject); //查询指定的结果字段
		return query;
    }

}
